package com.ben.multiple.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.regex.Pattern;

/**
 * 数字工具类
 *
 * @author BenJin Yin
 * @date 2019/10/25
 */
public final class NumberUtils {
    /**
     * 数字正则表达式：正整数、负整数、0、正小数、负小数、小数
     */
    private final static String POSITIVE_INTEGER_REGEX = "^(\\+)?[1-9]\\d*";
    private final static String NEGATIVE_INTEGER_REGEX = "(\\-)[1-9]\\d*";
    private final static String ZERO_REGEX = "[+-]?0+";
    private final static String POSITIVE_DECIMAL_REGEX = "(\\+)?(0\\.)\\d*|(\\+)?[1-9]\\d*\\.\\d*";
    private final static String NEGATIVE_DECIMAL_REGEX = "(\\-)(0\\.)\\d*|(\\-)[1-9]\\d*\\.\\d*";
    private final static String DECIMAL_REGEX = "[\\-\\+]?(0\\.)\\d*|[\\-\\+]?[1-9]\\d*\\.\\d*";

    /**
     * @param input 正整数
     * @return Boolean
     */
    public static Boolean isPositiveInteger(String input) {
        return isMatch(POSITIVE_INTEGER_REGEX, input);
    }

    /**
     * @param input 负整数
     * @return Boolean
     */
    public static Boolean isNegativeInteger(String input) {
        return isMatch(NEGATIVE_INTEGER_REGEX, input);
    }

    /**
     * @param input 整数
     * @return Boolean
     */
    public static Boolean isInteger(String input) {
        return isMatch(ZERO_REGEX, input) || isPositiveInteger(input) || isNegativeInteger(input);
    }

    /**
     * @param input 正小数  包含 0
     * @return Boolean
     */
    public static Boolean isPositiveDecimal(String input) {
        return isMatch(POSITIVE_DECIMAL_REGEX, input);
    }

    /**
     * @param input 负小数  包含 0
     * @return Boolean
     */
    public static Boolean isNegativeDecimal(String input) {
        return isMatch(NEGATIVE_DECIMAL_REGEX, input);
    }

    /**
     * @param input 小数
     * @return Boolean
     */
    public static Boolean isDecimal(String input) {
        return isMatch(DECIMAL_REGEX, input);
    }

    /**
     * @param input 数
     * @return Boolean
     */
    public static Boolean isNumber(String input) {
        return isInteger(input) || isDecimal(input);
    }

    /**
     * 数字正则校验
     *
     * @param regex 正则表达式
     * @param input 需要校验的参数
     * @return Boolean
     */
    private static Boolean isMatch(String regex, String input) {
        if (regex == null || input == null || "".equals(regex) || "".equals(input)) {
            return false;
        }
        return Pattern.matches(regex, input);
    }

    /**
     * 为 double 设置精度；采用四舍五入的方式，默认 2 位小数；数据库设置浮点数建议都使用 decimal 类型
     *
     * @param num      double
     * @param newScale 精度
     * @return Double    Double
     */
    public static Double setDoubleScale(Double num, Integer newScale) {
        if (num == null) {
            return (double) 0;
        }
        newScale = newScale == null ? 2 : newScale;
        return BigDecimal.valueOf(num).setScale(newScale, RoundingMode.HALF_UP).doubleValue();
    }
}
